import os
import sys

# === Validar argumentos ===
if len(sys.argv) != 3:
    print("Uso: python script.py <nombre_lista_cfg> <ruta_salida_relativa_al_proyecto>")
    print("Ejemplo: python script.py lista_bank4.cfg salida_binarios/bank4.bin")
    sys.exit(1)

nombre_cfg = sys.argv[1]
ruta_salida_relativa = sys.argv[2]

# === Directorios base ===
script_dir = os.path.dirname(os.path.abspath(__file__))
base_dir = os.path.normpath(os.path.join(script_dir, "..", ".."))  # directorio del proyecto

bin_dir = os.path.join(base_dir, "binarios")
txts_dir = os.path.join(bin_dir, "txts")

# === Rutas completas ===
cfg_file = os.path.join(script_dir, nombre_cfg)
output_file = os.path.join(base_dir, ruta_salida_relativa)
output_dir = os.path.dirname(output_file)

# Obtener nombre base del archivo de salida (sin extensión)
nombre_salida_sin_ext = os.path.splitext(os.path.basename(output_file))[0]
nombre_def = f"def{nombre_salida_sin_ext.capitalize()}.txt"

# Ruta dos niveles arriba del output_file
code_txt_dir = os.path.normpath(os.path.join(output_dir, "..", ".."))
code_txt_path = os.path.join(code_txt_dir, nombre_def)

#code_txt_path = os.path.join(output_dir, "defBloqueCodigo.txt")

direccion_memoria_inicial = 49152

# === Validaciones ===
if not os.path.exists(cfg_file):
    print(f"Error: No se encontró el archivo de lista: {cfg_file}")
    sys.exit(1)

if not os.path.exists(output_dir):
    os.makedirs(output_dir)

# === Leer lista de archivos ===
with open(cfg_file, "r") as f:
    selected_files = [line.strip() for line in f if line.strip()]

if not selected_files:
    print("Error: la lista está vacía.")
    sys.exit(1)

# === Generar binario y definiciones ===
try:
    with open(output_file, "wb") as outfile_bin:
        with open(code_txt_path, "w", encoding="utf-8") as outfile_txt:

            direccion_memoria = direccion_memoria_inicial

            for name in selected_files:
                bin_path = os.path.join(bin_dir, name + ".bin")
                txt_path = os.path.join(txts_dir, name + ".txt")

                if not os.path.exists(bin_path):
                    print(f"Error: No se encontró el archivo bin: {bin_path}")
                    sys.exit(1)

                with open(bin_path, "rb") as infile:
                    outfile_bin.write(infile.read())

                if not os.path.exists(txt_path):
                    print(f"Error: No se encontró el archivo TXT: {txt_path}")
                    sys.exit(1)

                with open(txt_path, "r", encoding="utf-8") as txtfile:
                    incremento = 0
                    lineas = txtfile.readlines()

                    for line in lineas[1:]:  # saltar primera línea
                        line = line.strip()
                        if not line:
                            continue

                        partes = line.split()
                        if len(partes) == 3:
                            _, longitud, texto = partes
                            incremento = int(longitud)
                        else:
                            texto = ""

                        nueva_linea = f"#DEFINE {texto} {direccion_memoria}\n"
                        outfile_txt.write(nueva_linea)
                        direccion_memoria += incremento

    print(f"✅ Archivo generado: {output_file}")
    print(f"✅ Archivo de definiciones: {code_txt_path}")

except Exception as e:
    print(f"❌ Error durante la generación: {e}")
    sys.exit(1)
